using Avalonia;
using System;
using System.Threading;
using System.Diagnostics;
using System.IO;

namespace FileSyncApp;

/// <summary>
/// FileSyncApp 应用程序的主入口点类
/// 负责初始化和配置 Avalonia UI 框架，启动应用程序
/// </summary>
/// <remarks>
/// 这个类包含应用程序的启动逻辑和 Avalonia 框架的基本配置
/// 使用经典桌面生命周期管理，支持跨平台运行，并确保单实例运行
/// </remarks>
class Program
{
    /// <summary>
    /// 应用程序互斥锁，用于确保单实例运行
    /// </summary>
    private static Mutex? _mutex;
    
    /// <summary>
    /// 应用程序唯一标识符，用于创建互斥锁
    /// </summary>
    private const string APP_MUTEX_NAME = "FileSyncApp_SingleInstance_Mutex_2024";

    /// <summary>
    /// 应用程序的主入口点方法
    /// </summary>
    /// <param name="args">命令行参数数组</param>
    /// <remarks>
    /// 注意：在 AppMain 被调用之前，不要使用任何 Avalonia、第三方 API 
    /// 或任何依赖 SynchronizationContext 的代码，因为这些组件尚未初始化，
    /// 可能会导致程序崩溃或异常行为
    /// </remarks>
    [STAThread]
    public static void Main(string[] args)
    {
        // 检查是否已有实例在运行
        if (!CheckSingleInstance())
        {
            ShowAlreadyRunningMessage();
            return;
        }

        try
        {
            BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);
        }
        finally
        {
            // 释放互斥锁
            ReleaseMutex();
        }
    }

    /// <summary>
    /// 检查是否为单实例运行
    /// </summary>
    /// <returns>如果是第一个实例返回true，否则返回false</returns>
    private static bool CheckSingleInstance()
    {
        try
        {
            _mutex = new Mutex(true, APP_MUTEX_NAME, out bool createdNew);
            return createdNew;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"检查单实例时发生错误: {ex.Message}");
            return true; // 出错时允许启动，避免阻止正常使用
        }
    }

    /// <summary>
    /// 显示程序已在运行的提示信息
    /// </summary>
    private static void ShowAlreadyRunningMessage()
    {
        try
        {
            // 尝试找到已运行的进程并激活其窗口
            var currentProcess = Process.GetCurrentProcess();
            var processes = Process.GetProcessesByName(currentProcess.ProcessName);
            
            foreach (var process in processes)
            {
                if (process.Id != currentProcess.Id && !process.HasExited)
                {
                    // 找到其他实例，尝试激活其主窗口
                    try
                    {
                        if (process.MainWindowHandle != IntPtr.Zero)
                        {
                            // 在 macOS 上，我们可以尝试使用 osascript 来激活应用
                            if (OperatingSystem.IsMacOS())
                            {
                                var appName = Path.GetFileNameWithoutExtension(currentProcess.ProcessName);
                                Process.Start("osascript", $"-e 'tell application \"{appName}\" to activate'");
                            }
                        }
                    }
                    catch
                    {
                        // 激活窗口失败，忽略错误
                    }
                    break;
                }
            }
            
            Console.WriteLine("FileSyncApp 已在运行中。如果看不到窗口，请检查系统托盘。");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"FileSyncApp 已在运行中: {ex.Message}");
        }
    }

    /// <summary>
    /// 释放互斥锁资源
    /// </summary>
    private static void ReleaseMutex()
    {
        try
        {
            _mutex?.ReleaseMutex();
            _mutex?.Dispose();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"释放互斥锁时发生错误: {ex.Message}");
        }
    }

    /// <summary>
    /// 构建和配置 Avalonia 应用程序实例
    /// </summary>
    /// <returns>配置完成的 AppBuilder 实例</returns>
    /// <remarks>
    /// 此方法配置 Avalonia 应用程序的基本设置：
    /// - Configure&lt;App&gt;(): 指定应用程序类型
    /// - UsePlatformDetect(): 自动检测并使用适合当前平台的渲染后端
    /// - WithInterFont(): 使用 Inter 字体作为默认字体
    /// - LogToTrace(): 启用跟踪日志记录
    /// 
    /// 注意：此配置也被 Visual Designer 使用，请勿随意删除
    /// </remarks>
    public static AppBuilder BuildAvaloniaApp()
        => AppBuilder.Configure<App>()
            .UsePlatformDetect()
            .WithInterFont()
            .LogToTrace();
}